package com.espeaker.sdk;

import java.util.ArrayList;
import android.text.TextUtils;

/**
 * SDK API请求参数
 * @author jimmy
 */
public class ESpeakerParameters {

	private ArrayList<String> mKeys = new ArrayList<String>();
	private ArrayList<Object> mValues =new ArrayList<Object>();
    private ArrayList<Boolean> mSigns = new ArrayList<Boolean>();
	
	public ESpeakerParameters(){
		
	}

    /**
     * 添加一个String型参数
     * @param key 参数的键值
     * @param value 参数的值
     */
	public void add(String key, Object value){
	    if (!TextUtils.isEmpty(key)) {
	        mKeys.add(key);
	        mValues.add(value);
            mSigns.add(false);
	    }
	   
	}

    /**
     * 添加一个int型参数
     * @param key 参数的键值
     * @param value 参数的值
     */
	public void add(String key, int value) {
	    this.mKeys.add(key);
        this.mValues.add(String.valueOf(value));
        mSigns.add(false);
	}

    /**
     * 添加一个long型参数
     * @param key 参数的键值
     * @param value 参数的值
     */
	public void add(String key, long value) {
	    this.mKeys.add(key);
        this.mValues.add(String.valueOf(value));
        mSigns.add(false);
    }

    /**
     * 添加一个double型参数
     * @param key 参数的键值
     * @param value 参数的值
     */
    public void add(String key, double value) {
        this.mKeys.add(key);
        this.mValues.add(String.valueOf(value));
        mSigns.add(false);
    }

    /**
     * 添加一个String型参数
     * @param key 参数的键值
     * @param value 参数的值
     * @param sign 参数是否需要签名，true：需要签名，false：不需要签名
     */
    public void add(String key, String value, boolean sign){
        if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) {
            mKeys.add(key);
            mValues.add(value);
            mSigns.add(sign);
        }

    }
    /**
     * 添加一个Object型参数
     * @param key 参数的键值
     * @param value 参数的值
     * @param sign 参数是否需要签名，true：需要签名，false：不需要签名
     */
    public void add(String key, Object value, boolean sign){
        if (!TextUtils.isEmpty(key)) {
            mKeys.add(key);
            mValues.add(value);
            mSigns.add(sign);
        }

    }
    /**
     * 添加一个int型参数
     * @param key 参数的键值
     * @param value 参数的值
     * @param sign 参数是否需要签名，true：需要签名，false：不需要签名
     */
    public void add(String key, int value, boolean sign) {
        this.mKeys.add(key);
        this.mValues.add(String.valueOf(value));
        mSigns.add(sign);
    }

    /**
     * 添加一个long型参数
     * @param key 参数的键值
     * @param value 参数的值
     * @param sign 参数是否需要签名，true：需要签名，false：不需要签名
     */
    public void add(String key, long value, boolean sign) {
        this.mKeys.add(key);
        this.mValues.add(String.valueOf(value));
        mSigns.add(sign);
    }

    /**
     * 添加一个double型参数
     * @param key 参数的键值
     * @param value 参数的值
     * @param sign 参数是否需要签名，true：需要签名，false：不需要签名
     */
    public void add(String key, double value, boolean sign) {
        this.mKeys.add(key);
        this.mValues.add(String.valueOf(value));
        mSigns.add(sign);
    }

    /**
     * 移除某个键值的参数
     * @param key 参数的键值
     */
	public void remove(String key) {
	    int firstIndex=mKeys.indexOf(key);
	    if(firstIndex >=0 ){
	        this.mKeys.remove(firstIndex);
	        this.mValues.remove(firstIndex);
            mSigns.remove(firstIndex);
	    }
	  
	}

    /**
     * 移除某个位置的参数
     * @param i 参数的位置
     */
	public void remove(int i) {
	    if (i < mKeys.size()) {
	        mKeys.remove(i);
	        this.mValues.remove(i);
            mSigns.remove(i);
	    }
	}

    /**
     * 获取某个参数的位置
     * @param key 参数的键值
     * @return
     */
	private int getLocation(String key) {
		if (this.mKeys.contains(key)) {
			return this.mKeys.indexOf(key);
		}
		return -1;
	}

    /**
     * 获取某个位置参数的键值
     * @param location 位置
     * @return
     */
	public String getKey(int location) {
		if (location >= 0 && location < this.mKeys.size()) {
			return this.mKeys.get(location);
		}
		return "";
	}

    /**
     * 获取参数值
     * @param key 参数键值
     * @return
     */
	public Object getValue(String key) {
	    int index = getLocation(key);
	    if (index >=0 && index < this.mKeys.size()) {
	        return this.mValues.get(index);
	    } else {
	        return null;
	    }
	}

    /**
     * 获取参数值
     * @param location 参数位置
     * @return
     */
	public Object getValue(int location){
	    if (location >=0 && location < this.mKeys.size()) {
	        return this.mValues.get(location);
	    } else {
	        return null;
	    }
		
	}

    /**
     * 某个键参数是否需要加入签名
     * @param key 参数键名
     * @return
     */
    public boolean isSign(String key) {
        int index = getLocation(key);
        if (index >=0 && index < this.mKeys.size()) {
            return mSigns.get(index);
        } else {
            return false;
        }
    }

    /**
     * 某个键参数是否需要加入签名
     * @param location 参数位置
     * @return
     */
    public boolean isSign(int location) {
        if (location >=0 && location < this.mKeys.size()) {
            return mSigns.get(location);
        } else {
            return false;
        }
    }
	
	public int size(){
		return mKeys.size();
	}
	
	public void addAll(ESpeakerParameters parameters) {
		for (int i = 0; i < parameters.size(); i++) {
			this.add(parameters.getKey(i), parameters.getValue(i));
		}
	}
	
	public void clear() {
		this.mKeys.clear();
		this.mValues.clear();
        this.mSigns.clear();
	}
	
}
